class BaseProxy {
  constructor(proxyStats) {
    this.name = proxyStats.name
    if (proxyStats.conf != null) {
      this.encryption = proxyStats.conf.use_encryption
      this.compression = proxyStats.conf.use_compression
    } else {
      this.encryption = ''
      this.compression = ''
    }
    this.conns = proxyStats.cur_conns
    this.traffic_in = proxyStats.today_traffic_in
    this.traffic_out = proxyStats.today_traffic_out
    this.last_start_time = proxyStats.last_start_time
    this.last_close_time = proxyStats.last_close_time
    this.status = proxyStats.status
  }
}

class TcpProxy extends BaseProxy {
  constructor(proxyStats) {
    super(proxyStats)
    this.type = 'tcp'
    if (proxyStats.conf != null) {
      this.addr = ':' + proxyStats.conf.remote_port
      this.port = proxyStats.conf.remote_port
    } else {
      this.addr = ''
      this.port = ''
    }
  }
}

class UdpProxy extends BaseProxy {
  constructor(proxyStats) {
    super(proxyStats)
    this.type = 'udp'
    if (proxyStats.conf != null) {
      this.addr = ':' + proxyStats.conf.remote_port
      this.port = proxyStats.conf.remote_port
    } else {
      this.addr = ''
      this.port = ''
    }
  }
}

class HttpProxy extends BaseProxy {
  constructor(proxyStats, port, subdomain_host) {
    super(proxyStats)
    this.type = 'http'
    this.port = port
    if (proxyStats.conf != null) {
      this.custom_domains = proxyStats.conf.custom_domains
      this.host_header_rewrite = proxyStats.conf.host_header_rewrite
      this.locations = proxyStats.conf.locations
      if (proxyStats.conf.sub_domain !== '') {
        this.subdomain = proxyStats.conf.sub_domain + '.' + subdomain_host
      } else {
        this.subdomain = ''
      }
    } else {
      this.custom_domains = ''
      this.host_header_rewrite = ''
      this.subdomain = ''
      this.locations = ''
    }
  }
}

class HttpsProxy extends BaseProxy {
  constructor(proxyStats, port, subdomain_host) {
    super(proxyStats)
    this.type = 'https'
    this.port = port
    if (proxyStats.conf != null) {
      this.custom_domains = proxyStats.conf.custom_domains
      if (proxyStats.conf.sub_domain !== '') {
        this.subdomain = proxyStats.conf.sub_domain + '.' + subdomain_host
      } else {
        this.subdomain = ''
      }
    } else {
      this.custom_domains = ''
      this.subdomain = ''
    }
  }
}

class StcpProxy extends BaseProxy {
  constructor(proxyStats) {
    super(proxyStats)
    this.type = 'stcp'
  }
}

export { BaseProxy, TcpProxy, UdpProxy, HttpProxy, HttpsProxy, StcpProxy }
